library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.FAW_TYPES.ALL;

entity SampledPointsEnabler is
    Port ( i_spe : in  COUNTER_ROWS;
           j_spe : in  COUNTER_COLUMNS;
           clk_spe : in  STD_LOGIC;
			  reset_spe : in STD_LOGIC;
           en_spe : out  SR_ENABLE_BUS;
           en_rows_spe : out  SR_ENABLE_ROWS);
end SampledPointsEnabler;

architecture Behavioral of SampledPointsEnabler is

begin

	processo:process(clk_spe)
	
	variable EN_INDEX : integer;
	variable EN_SPE_VAR :   SR_ENABLE_BUS;
   variable EN_ROWS_SPE_VAR : SR_ENABLE_ROWS;
	variable J_VAR:integer;
	variable I_VAR:integer;
	variable J_VAR_MOD_W:integer;
		begin
			if (clk_spe'event and clk_spe='1') then
			
				J_VAR:=j_spe+2;
--				if(j_spe=W)then
--					J_VAR_MOD_W:=0;
--				else
--					J_VAR_MOD_W:=J_VAR;
--				end if;
		--		if(reset_spe='1' or (j_spe=1 and i_spe=1) or J_VAR_MOD_W=0)then		--reset
				if(reset_spe='1' or (j_spe=1 and i_spe=1) or j_spe=W)then		--reset
					for i in 0 to RSPSRC_SR_REGISTERS-1 loop
						if((j_spe=1 and i_spe=1) or reset_spe='1')then
							EN_ROWS_SPE_VAR(i):='0';
						end if;
						for j in 0 to N_SP_IN_ROW-1 loop
							EN_SPE_VAR(i)(j):='0';
						end loop;
					end loop;
				end if;
			
			--macchina a stati per le colonne (punti di campionamento)
				
				if(((J_VAR mod P) = 0) and (J_VAR>=P)) then -- entra un pixel di campionamento nella finestra
					EN_INDEX :=(J_VAR/P)-1;
					for i in 0 to RSPSRC_SR_REGISTERS-1 loop
						if(((i_spe mod P) = 0) and (i=((i_spe/p) mod RSPSRC_SR_REGISTERS)))then		--siamo su una riga di campionamento
							--SR NON a regime
							for j in 0 to N_MAX_COLUMNS-1 loop		--apriamo tutti i primi N
								EN_SPE_VAR(i)(j):='1';
							end loop;
						else		--NON siamo su una riga di campionamento
							EN_SPE_VAR(i)(N_SP_IN_ROW-1-EN_INDEX):='1';
						end if;
					end loop;
				end if;
				
				if((J_VAR > N )) then
					if (((J_VAR-N)mod P) = 0) then --esce un pixel di campionamento dalla finestra
						EN_INDEX :=((J_VAR-N)/P)-1;
						for i in 0 to RSPSRC_SR_REGISTERS-1 loop
							if((i_spe mod P = 0) and i=((i_spe/p) mod RSPSRC_SR_REGISTERS))then
							--SR NON a regime
									EN_SPE_VAR(i)(N_MAX_COLUMNS-1):='0';
							else
								EN_SPE_VAR(i)(N_SP_IN_ROW-1-EN_INDEX):='0';
							end if;
						end loop;
					end if;
				end if;
				
			--macchina a stati per le righe (righe di campionamento)
				
				
				I_VAR:=i_spe+1;
				if((I_VAR mod P) = 0 and I_VAR>=P and j_spe=W) then -- entra una riga di campionamento nella finestra
					EN_INDEX :=(I_VAR/P)mod RSPSRC_SR_REGISTERS;
					EN_ROWS_SPE_VAR(EN_INDEX):='1';
				end if;
				if((I_VAR > N) and (j_spe=W) ) then
					if (((I_VAR-N)mod P) = 0) then --esce una riga di campionamento dalla finestra
						EN_INDEX :=((I_VAR-N)/P)mod RSPSRC_SR_REGISTERS;
						EN_ROWS_SPE_VAR(EN_INDEX):='0';
					end if;
				end if;				
			end if;
			
			en_spe<=en_spe_VAR;
			en_rows_spe<=EN_ROWS_SPE_VAR;
		end process;

end Behavioral;

